/*
 * @Author: Starfish_DL
 * @Date: 2020-09-17 08:08:07
 * @LastEditTime: 2020-09-22 17:34:01
 * @LastEditors: Please set LastEditors
 * @Description: Finish homework of 0917 using C.
 * @FilePath: \undefinedc:\vscode\cpp\0917.cpp
 */

#include<stdio.h>
#include<stdlib.h>
//#include<iostream>
//using namespace std;
//#define nullptr NULL

typedef struct intLinkedList
{
    //int* previous;
    int data;
    struct intLinkedList* next;
}iLinkListNode;
/*
void CreateListF(iLinkListNode *&L,int a[],int n)
{
    //将数组a中数量为n的值赋给链表L
    iLinkListNode *s;
    L=(iLinkListNode *)malloc(sizeof(iLinkListNode));
    L->next=NULL;
    for (int i = 0; i < n; i++)
    {
        s=(iLinkListNode *)malloc(sizeof(iLinkListNode));
        s->data=a[i];
        s->next=L->next;
        L->next=s;
    }
}*/
/*
void CreateListF(iLinkListNode *&L,int a[],int n)
{
    iLinkListNode *s;
    L=(iLinkListNode *)malloc(sizeof(iLinkListNode));
    L->next=nullptr;
    for (int i = 0; i < n; i++)
    {
        s=(iLinkListNode *)malloc(sizeof(iLinkListNode));
        s->data=a[i];
        s->next=L->next;
        L->next=s;
    }
}*/
/*
void CreateListR(iLinkListNode *&L,int a[],int n)
{
    iLinkListNode *s,*r;
    L=(iLinkListNode *)malloc(sizeof(iLinkListNode));
    r=L;
    for (int i = 0; i < n; i++)
    {
        s=(iLinkListNode *)malloc(sizeof(iLinkListNode));
        s->data=a[i];
        r->next=s;
        r=s;
    }
    r->next=nullptr;
}*/

void CreateListR(iLinkListNode *&L,int a[],int n)
{
    iLinkListNode *r,*s;
    L=(iLinkListNode *)malloc(sizeof(iLinkListNode));
    r=L;
    for (int i = 0; i < n; i++)
    {
        s=(iLinkListNode *)malloc(sizeof(iLinkListNode));
        s->data=a[i];
        r->next=s;
        r=s;
    }
    r->next=nullptr;
}

void DestroyList(iLinkListNode *&L)
{
    //single link list destroy
    iLinkListNode *pre=L,*p=L->next;
    while (p!=nullptr)
    {
        free(pre);
        pre=p;
        p=p->next;
    }
    free(pre);
}

bool ListEmpty(iLinkListNode *L)
{
    return(L->next==nullptr);
}

int ListLength(iLinkListNode *L)
{
    int k=1;
    iLinkListNode *pre=L->next;
    while (pre->next!=nullptr)
    {
        pre=pre->next;
        k++;
    }
    return k;
}

void DispList(iLinkListNode *L)
{
    iLinkListNode *p=L->next;
    while (p!=nullptr)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}

bool GetELem(iLinkListNode *L,int n,int &e)
{
    if(n<=0)
    {
        return false;
    }
    iLinkListNode *p=L;
    for (int i = 0; i < n; i++)
    {
        p=p->next;
        if(p==nullptr)
        {
            return false;
        }
    }
    e=p->data;
    return true;
}

int LocateElem(iLinkListNode *L,int e)
{
    int i=1;
    iLinkListNode *p=L->next;
    while (p!=nullptr)
    {
        if (p->data==e)
        {
            return i;
        }
        else
        {
            i++;
            p=p->next;
        }
    }
    return 0;
}

bool ListInsert(iLinkListNode *L,int k,int e)
{
    //insert a number into the linklist
    if(k<=0)
    {
        return false;
    }
    iLinkListNode *p=L;
    for (int i = 0; i < k-1; i++)
    {
        if (p->next==nullptr)
        {
            return false;
        }
        p=p->next;
    }
    iLinkListNode *s=(iLinkListNode *)malloc(sizeof(iLinkListNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return true;
}

bool ListDelete(iLinkListNode *L,int k)
{
    if(k<=0)
    {
        return false;
    }
    iLinkListNode *p=L;
    iLinkListNode *q;
    for (int i = 0; i < k-1; i++)
    {
        if (p->next==nullptr)
        {
            return false;
        }
        p=p->next;
    }
    if(p->next==nullptr)
    {
        return false;
    }
    q=p->next;
    p->next=p->next->next;
    free(q);
    return true;
}

int main()
{
    //Here is the code for data validation
    iLinkListNode *node1;
    int list1[7]={1,2,3,4,5,6,7};
    CreateListR(node1,list1,7);
    //ListInsert(node1,4,9);
    //ListDelete(node1,4);
    DispList(node1);

    //cout << ListEmpty(node1);  The output is 0 or 1
    //printf("%d",ListLength(node1));

    /*
    int e=0;
    GetELem(node1,4,e);
    printf("%d",e);
    */

    //printf("%d",LocateElem(node1,5));
    DestroyList(node1);
    return 0;
}